package experiment5.demo2;

/**
 * @Description:
 * @author:fyl
 * @date 2021/4/22 8:00
 * @Modified By:
 * @Modified Date:
 */

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

/**
 * @author Anonymous
 * @description
 * @date 2020/3/9 10:01
 * <p>
 * 客户端接收数据线程
 * <p>
 * 这里需要输入流
 * 输入流是通过Socket对象获取的，也就是在客户端连接服务器之后才可以获取到输入流
 * 成员变量：
 * 输入流
 * DataInputStream
 * 标记是否连接
 * 构造方法：
 * 需要Socket作为当前构造的参数
 * 成员方法：
 * 从服务器接收数据，展示
 */
public class ClientReceive implements Runnable {

    /**
     * 用于接收数据的输入流对象
     */
    private DataInputStream inputStream;

    /**
     * 是否连接状态标记
     */
    private boolean connection;

    /**
     * 根据客户端连接服务器对应的Socket对象获取输入流对象
     *
     * @param socket 客户端连接服务器对应的Socket
     */
    public ClientReceive(Socket socket) {
        try {
            inputStream = new DataInputStream(socket.getInputStream());
            connection = true;
        } catch (IOException e) {
            e.printStackTrace();
            connection = false;
        }
    }

    /**
     * 接收数据并且展示
     */
    public void receive() {
        String msg = null;

        try {
            msg = inputStream.readUTF();
        } catch (IOException e) {
            e.printStackTrace();
            /*
            接收数据出现异常:
                连接标记修改
                不是null关闭资源
             */
            connection = false;
            CloseUtil.closeAll(inputStream);
        }

        System.out.println(msg);
    }

    /**
     * 线程核心方法，只要连接状态OK，始终保存接收状态
     */
    @Override
    public void run() {
        while (connection) {
            receive();
        }
    }
}

